'use strict';

const Controller = require('egg').Controller;
const sha256 = require("js-sha256").sha256

class HomeController extends Controller {
    // 注册
    async add() {
        let { ctx, app } = this;

        let { userAccount, nickName, password, roleId  } = this.ctx.request.body;
		
		// 参数验证
		const paramVerification = await ctx.parameter({ userAccount, nickName, password, roleId  })
		if(paramVerification !== ''){
		    return ctx.apiFail(paramVerification);
		}

        // 获取当前时间戳
        const created_at = (new Date()).getTime();

        // 判断当前昵称是否存在
        const resSelect = await app.mysql.get('User', { nickName });
        if(resSelect !== null){
            return ctx.apiFail('注册失败 改昵称已存在');
        }
		
		// 判断当前账户是否存在
		const resSelect2 = await app.mysql.get('User', { userAccount });
		if(resSelect2 !== null){
		    return ctx.apiFail('注册失败 改账号已存在');
		}

        // 数据库插入
        const result = await app.mysql.insert('User', { userAccount, nickName, password: sha256(password), roleId:roleId*1, created_at});

        if(result.affectedRows !== 1){
            return ctx.apiFail('注册失败');
        }

        return ctx.apiSuccess('注册成功');
    }

    // 登录
    async login() {
        const { ctx, app } = this;
        let { userAccount, password } = ctx.request.body;

        // 参数验证
        const paramVerification = await ctx.parameter({ userAccount, password })
        if(paramVerification !== ''){
            return ctx.apiFail(paramVerification);
        }

        // 查询账户信息
        const user = await app.mysql.get('User', { userAccount, password:sha256(password) });
        if(user === null){
            return ctx.apiFail('登录失败,账户或者密码错误!');
        }
        
        // 生成token
        let token = ctx.getToken(JSON.parse(JSON.stringify(user)));
        user.token = token;
        
        // 加入缓存中
        if (!await this.service.cache.set('user_' + user.id, token)) {
            return ctx.apiFail('登录失败');
        }
        
        // 返回用户信息和token
        return ctx.apiSuccess(user);
    }

	// 退出登录
	async logout() {
		const { ctx, service } = this;
		
		// 拿到当前用户id
		let current_user_id = ctx.authUser.id;

		// 移除redis当前用户信息
		if (!await service.cache.remove('user_' + current_user_id)) {
			ctx.throw(400, '退出登录失败');
		}
		ctx.apiSuccess('退出成功');
	}
	
	// 账户信息查询
	async userList(){
		const { ctx, app } = this;
		
		const { pages, pageNumber } = ctx.query;
		
		// 参数验证
		const paramVerification = await ctx.parameter({ pages, pageNumber })
		if(paramVerification !== ''){
		    return ctx.apiFail(paramVerification);
		}
		
		// 查询数据总记录数
		const resultsCount = await this.app.mysql.query('SELECT count(*) FROM User');
		const sum = resultsCount[0]['count(*)']; // 总页数
		
		// 分页查询数据
		const res = await this.app.mysql.select('User', { 
		  limit: pages*1, // 每页数据量
		  offset: pageNumber*1, // 页码
		});
		
		const data = {
			list:res, // 数据
			sum, // 总记录数
			SumPages: Math.ceil(sum/pages*1), // 总页数
			pageNumber: pageNumber*1, // 当前页码 
		}
		
		return ctx.apiSuccess(data);
		
	}
	
	// 修改密码
	async updatePwd(){
		const { ctx, app } = this;
		let { id, password } = ctx.request.body;
		
		// 参数验证
		const paramVerification = await ctx.parameter({ id, password })
		if(paramVerification !== ''){
		    return ctx.apiFail(paramVerification);
		}
		
		// 要修改的值
		const row = {
		  password:sha256(password),
		};
		
		// 修改条件
		const options = {
		  where: {
		    id
		  }
		};
		// 修改
		const result = await this.app.mysql.update('User', row, options);
		
		// 判断是否成功
		if(result.affectedRows !== 1){
			return ctx.apiFail('密码更改失败');
		}
		return ctx.apiSuccess('密码更改成功');
	}
	
	// 账户删除
	async userDel(){
		const { ctx, app } = this;
		let { id } = ctx.request.body;
		// 参数验证
		const paramVerification = await ctx.parameter({ id })
		if(paramVerification !== ''){
		    return ctx.apiFail(paramVerification);
		}
		
		// 删除
		const result = await this.app.mysql.delete('User', { id });
		
		// 判断是否成功
		if(result.affectedRows !== 1){
			return ctx.apiFail('删除失败');
		}
		
		return ctx.apiSuccess('删除成功');
	}
}

module.exports = HomeController;
